<?php
/**
 * Vbot 监听器
 * 2018年11月15日
 */
namespace app\common\service\vbot;

use app\common\model\wechat\WeChatVbotUserModel;
use app\common\service\SentryClientService;
use Hanson\Vbot\Console\QrCode;
use Hanson\Vbot\Support\File;

class VbotObserver
{
	/**
	 * 二维码监听器
	 * 在登录时会出现二维码需要扫码登录。而这个二维码链接也将传到二维码监听器中。
	 * @param string $qrCodeUrl
	 */
	public static function setQrCodeObserver($qrCodeUrl)
	{
		vbot('console')->log('二维码链接：'.$qrCodeUrl, '自定义消息');
		// 创建二维码文件
		vendor("phpqrcode.phpqrcode");
		// 纠错级别：L、M、Q、H
		$level = 'L';
		// 点的大小：1到10,用于手机端4就可以了
		$size = 7;
		// 文件地址
		$dir_path = WEB_UPLOADS . 'Temp';
		if ( !is_dir($dir_path) ) {
			mkdir($dir_path, 0755, true);
		}
		
		$qr_img_path = $dir_path.'/vbotWXqrcode.png';
		QRcode::png($qrCodeUrl, $qr_img_path, $level, $size, 2);
	}
	
	/**
	 * 登录成功监听器
	 * 登录成功时回调。无论是第一次登录还是免扫码登录均会触发。
	 */
	public static function setLoginSuccessObserver()
	{
		vbot('console')->log('登录成功', '自定义消息');
		// 获取自己实例
		$myself = vbot('myself');
		// 当前 昵称
		$myNickName = $myself->nickname;
		// 当前 session ID
		$myUserName = $myself->username;
		// 当前 唯一的ID
		$myUID = $myself->uin;
		
		// 处理数据
		$userModel = new WeChatVbotUserModel();
		$userData = $userModel->get_data_by_unique_key("uin", $myUID, false, false);
		if ( $userData ) {
			$update = [
					"username" => $myUserName,
					"nickname" => $myNickName,
					"is_login" => 1
			];
			$userModel->update_data_by_where(['uin'=>$myUID], $update);
		}else {
			$insert = [
					"username" => $myUserName,
					"nickname" => $myNickName,
					"uin" => $myUID,
					"is_login" => 1
			];
			$userModel->add_data($insert);
		}
		
	}
	
	/**
	 * 免扫码成功监听器
	 * 免扫码登录成功时回调。
	 */
	public static function setReLoginSuccessObserver()
	{
		vbot('console')->log('免扫码登录成功', '自定义消息');
	}
	
	/**
	 * 程序退出监听器
	 * 程序退出时回调。
	 */
	public static function setExitObserver()
	{
		vbot('console')->log('退出程序', '自定义消息');
		// 退出时更新登录状态
		$myself = vbot('myself');
		// 当前 唯一的ID
		$myUID = $myself->uin;
		// 更新用户登录状态
		$userModel = new WeChatVbotUserModel();
		$where = ['uin'=>$myUID];
		$userModel->update_data_by_where($where, ['is_login'=>-1]);
		// 退出提示
		$sentry = new SentryClientService();
		$sentry->sendMessage('微信网页机器人退出程序', SentryClientService::WARN);
	}
	
	/**
	 * 好友监听器
	 * 此回调仅在初始化好友时执行。
	 * 变量 $contacts 含有数组下表 ‘friends’,’groups’,’officials’,’special’,’members’
	 * @param array $contacts
	 */
	public static function setFetchContactObserver(array $contacts)
	{
		vbot('console')->log('获取好友成功', '自定义消息');
		//vbot('console')->log($contacts['officials'], '服务号');
		//vbot('console')->log($contacts['special'], '特殊号');
		//File::saveTo(__DIR__.'/group.json', $contacts['groups']);
	}
	
	/**
	 * 消息处理前监听器
	 * 接收消息前回调。
	 */
	public static function setBeforeMessageObserver()
	{
		vbot('console')->log('准备接收消息', '自定义消息');
	}
	
	/**
	 * 异常监听器
	 * 当接收消息异常时，当系统判断为太久没从手机端打开微信时，则急需打开，时间过久将断开。
	 */
	public static function setNeedActivateObserver()
	{
		vbot('console')->log('准备挂了，但应该能抢救一会', '自定义消息');
	}
}